<?php
/**
 * @package payma_svn
 * @subpackage package_name
 * @author Ricardo Santillan Reyes
 * @copyright (c) Instituto Tecnologico de Jiquilpan
 * @license Vea LICENCIA en el directorio raiz de este proyecto
 * @date Junio-Septiembre 2008
 * 
 */

class Autentificacion{
	
	static function &getAutentificacion(){
		static $instancia;
		if (!is_object($instancia)) {
			$instancia =& new Autentificacion();
		}
		return $instancia;
	}

	/**
	* Funcion de inicio de sesion
	*
	* @param object Nombre de usuario
	* @param object Password
	* @param object Recordar?
	* 
	* Una autentificacion correcta actualiza la sesion actual
	*/
	function login(&$mensaje,$usuario=null, $passwd=null, $remember=null) {
		$sesion =& Sesiones::getSesionActual();
		$basedatos =& MainBaseDatos::getMainBaseDatos();
		if (!$usuario OR !$passwd) {
			$usuario = getParametro($_REQUEST, 'clave', ''); //TODO Inicio de sesion | clave
			$passwd = getParametro($_REQUEST, 'pwdUser', '' ); //TODO Inicio de sesion | password
			$bypost = 1;
		}
		else $bypost = 0;
		if ($remember === null) $remember = getParametro($_REQUEST, 'recordar', ''); //TODO Inicio de sesion | Recordar

		if ($usuario && $passwd){
			$usuario = $basedatos->getEscaped($usuario);
			$passwd = md5($basedatos->getEscaped($passwd));
            $revisausuario = true;
            $mensaje = '';
            $revisausuario = $this->autentificarUsuario(&$mensaje, $usuario, $passwd,$remember,$sesion);
            if($revisausuario) return true;
			@session_destroy();
		}
        return false;
	}
	
	/**
	* Autentificar usuario
	*
	* Revisa el nombre del usuario y la contrasena en la base datos
	*/
	function autentificarUsuario (&$mensaje, $usuario, $passwd, $remember=null, $sesion=null) {
		$mensaje = '';
		if ($sesion === null) $sesion =& Sesiones::getSesionActual();
		$basedatos =& MainBaseDatos::getMainBaseDatos();
        if(strtolower($usuario) == 'admin' || strtolower($usuario) == 'administrador')
        	$usuario = 99; //TODO Clave numerica del super administrador
		else
			$usuario = intval($usuario);
		$basedatos->setConsultaPrefijo( "SELECT Id_Usuario, Id_Nivel, Us_Bloqueado "
		. "\nFROM #__usuarios"
		. "\nWHERE Id_Usuario='$usuario' AND Us_Password='$passwd'"
		);
        $basedatos->consulta();
        $row = null;
		if ($basedatos->loadObjeto($row)) {
			if ($row->Us_Bloqueado) { //TODO campo bloqueado | Login bloqueado para ese usuario
				$mensaje = __('Aun no activas tu cuenta o tu inicio de sesion ha sido bloqueado.');
				$this->clearSesion($sesion);
				return false;
			}
			$sesion->setUsuario($row->Id_Usuario,$row->Id_Nivel);
			$fechaActual = date("Y-m-d\TH:i:s");
			$sql = "UPDATE #__usuarios SET Us_Ultimavisita='$fechaActual' WHERE Id_Usuario='$sesion->Id_Usuario'";
            $basedatos->setConsultaPrefijo($sql);
			if (!$basedatos->consulta()) {
				die($basedatos->stderr(true));
			}
			if ($remember=="si") {
				$lifetime = time() + 365*24*60*60;
				setcookie("arqsys[nombre_usuario]", $usuario, $lifetime, "/");
				setcookie("arqsys[password]", $passwd, $lifetime, "/");
			}
			setcookie("arqsysUsuario", $row->Id_Usuario,time() + 30*60,"/");
		}else{
			if($usuario != 99) //TODO id usuario super administrador
				$mensaje = __('Nombre de usuario o contrasena incorrectos. Reintente');
			$this->clearSesion($sesion);
			return false;
		}
		return true;
	}

	function clearSesion ($sesion=null) {
		if ($sesion === null) $sesion =& Sesiones::getSesionActual();
		$sesion->Id_Usuario = 0;
		$sesion->Se_Invitado = 1;
		//$sesion->Id_Nivel = 4; //Niveles 4 - Invitado
		$sesion->update();
		$lifetime = time() - 1800;
		setcookie( "arqsys[nombre_usuario]", " ", $lifetime, "/" );
		setcookie( "arqsys[password]", " ", $lifetime, "/" );
		setcookie( "arqsys", " ", $lifetime, "/" );
        @session_destroy();
	}

	/**
	* Terminar sesion
	*/
	function logout(){
		$sesion =& Sesiones::getSesionActual();
		if ($sesion){
			$loginfo = new DetallesLogin($sesion->nombre_usuario);
			$this->clearSesion($sesion);
		}
	}

	function &loginAdmin () {
		$basedatos =& MainBaseDatos::getMainBaseDatos();
		$usrname = $basedatos->getEscaped(getParametro($_POST, 'usrname', ''));
		$pass = $basedatos->getEscaped(getParametro($_POST, 'pass', ''));

		$admin = null;
		if (!$pass) echo "<script>alert('".__('Escribe la contrasena')."'); document.location.href='index.php';</script>\n";
		else $pass = md5( $pass );

		$tipoAdmin = array ('administrador', 'admin');
		$admins = 0;
		$sql = "SELECT * FROM #__usuarios"
		. "\n WHERE ( LOWER( tipo_usuario ) = 'administrador'"
		. "\n OR LOWER( tipo_usuario ) = 'admin'"
		. "\n OR (nombre_usuario='$usrname' AND bloqueado=0))"
		;
		$usuarios = $basedatos->doSQLget( $sql, 'Usuario' );
		foreach ($usuarios as $key=>$usuario1) {
			if (in_array(strtolower($usuario1->tipo_usuario),$tipoAdmin)) $admins++;
			if ($usuario1->nombre_usuario == $usrname) $admin =& $usuarios[$key];
		}
		if ($admins == 0) echo "<script>alert(\"".__('No puedes inicar sesion. No existen administradores establecidos.')."\"); window.history.go(-1); </script>\n";
		elseif (isset($admin)) {
			if (strcmp( $admin->password, $pass )) {
				echo "<script>alert('".__('Nombre de usuario o contrasena incorrectos. Reintente de nuevo.')."'); document.location.href='index.php';</script>\n";
				return;
			}
			$tiempoLogin = time();
			$sesion_id = md5( "$admin->id$admin->nombre_usuario$admin->tipo_usuario$tiempoLogin" );
			$sql = "INSERT INTO #__sesiones" //TODO tabla sesiones
			. "\nSET tiempo='$logintime', id_sesion='$sesion_id', "
			. "id_usuario='$admin->id', tipo_usuario='$admin->tipo_usuario', nombre_usuario='$admin->nombre_usuario', invitado=-1"
			;
			$basedatos->setConsultaPrefijo($sql);
			if (!$basedatos->consulta()) {
				echo $basedatos->stderr();
			}
			$_SESSION['sesID'] = $sesion_id;
			$_SESSION['sesIdUsuario'] = $admin->id;
			$_SESSION['sesNombreUsuario'] = $admin->nombre_usuario;
			$_SESSION['sesTipoUsuario'] = $admin->tipo_usuario;
			$_SESSION['sesTiempoLogin'] = $tiempoLogin;
			$_SESSION['sesEstadoUsuario'] = array();
		}
		return $admin;
	}
	
	/**
	* Generador de password aleatorios
	* @return password
	*/
	function makePassword($pLen = 8) {
		$mascara = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
		$len = strlen($mascara);
		$pwd="";
		mt_srand(10000000*(double)microtime());
		for ($i = 0; $i < $pLen; $i++)
		$pwd .= $mascara[mt_rand(0,$len - 1)];
		return $pwd;
	}
}
